//////////////////////////////////////////////////////////////////////////////////
//                                                                              //
//  This file is part of the buola project (https://code.google.com/p/buola/).  //
//                                                                              //
//  Copyright(c) 2007-2012 Xavi Gratal                                          //
//  gratal AT gmail DOT com                                                     //
//                                                                              //
//  Buola is free software: you can redistribute it and/or modify               //
//  it under the terms of the GNU General Public License as published by        //
//  the Free Software Foundation, either version 3 of the License, or           //
//  (at your option) any later version.                                         //
//                                                                              //
//  Buola is distributed in the hope that it will be useful,                    //
//  but WITHOUT ANY WARRANTY; without even the implied warranty of              //
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               //
//  GNU General Public License for more details.                                //
//                                                                              //
//  You should have received a copy of the GNU General Public License           //
//  along with buola.  If not, see <http://www.gnu.org/licenses/>.              //
//                                                                              //
//////////////////////////////////////////////////////////////////////////////////

#ifndef _CCONFSERVER_H_
#define _CCONFSERVER_H_

#include <buola/bbox/bservice.h>
#include <buola/db.h>

namespace buola { namespace bconf {

class CConfService : public bbox::BService<CConfService>
{
public:
    CConfService();
    ~CConfService();
    
private:
////////////////////////
// database functions
//
    void InitDatabase();
    void OpenDatabase();
    void PrepareQueries();

////////////////////////
// data functions
//
    int GetFolderID(const std::string &pFolder,bool pCreate=false);
    int CreateFolder(const std::string &pFolder);
    UValue GetValue(const std::string &pPath,const std::string &pKey);
    std::vector<std::string> GetKeyList(const std::string &pPath);
    std::map<std::string,UValue> GetKeyValueList(const std::string &pPath);
    void SetValue(const std::string &pPath,const std::string &pKey,const UValue &pValue);

//bbox functions
public:
    template <class tIntrospector>
    static void Introspect(tIntrospector &pI)
    {
        pI.template AddMethod<UValue(const std::string&,const std::string&)>("GetValue",&CConfService::GetValue);
        pI.template AddMethod<std::vector<std::string>(const std::string&)>("GetKeyList",&CConfService::GetKeyList);
        pI.template AddMethod<std::map<std::string,UValue>(const std::string&)>("GetKeyValueList",&CConfService::GetKeyValueList);
        pI.template AddMethod<void(const std::string&,const std::string&,const UValue&)>("SetValue",&CConfService::SetValue);
    }

//data
    CDatabase mDB;

    struct
    {
        CDBQuery mInsertFolder;
        CDBQuery mInsertKey;
        CDBQuery mGetFolderID;
        CDBQuery mGetChildren;
        CDBQuery mGetKey;
        CDBQuery mGetKeyNames;
        CDBQuery mGetKeys;
    } mQueries;
};

/*namespace bconf*/ } /*namespace buola*/ }

#endif
